(function($){
	
	var defaultOptions = {
		jwPlayer: {
			url:		"contrib/jwplayer/mediaplayer.swf",		// url плеера
			skin:		"contrib/jwplayer/skins/modieus.swf"	// url скина
		},
		swfObject: {
			expressInstall: "contrib/swfobject/expressInstall.swf"	// url expressInstall.swf
		},
		newWindow: true,
		lang:	{	// языковые переменные
			newWindow:	"Open in new window" // открыть в новом окне
		}
	};

	$.osmioModalMedia = function(opts){

		defaultOptions = $.extend(defaultOptions, opts);

	};
	
	// --------------------------------------------------
	// Модальник

	var modals = [null];

	var osmioModalMedia = function(obj) {

		var self = $(obj);
		var t = this;

		this.id = modals.length;
		modals[this.id] = this;

		var options =  $.extend({}, defaultOptions);
		this.options = options;

		var loadTimeout = null;

		// --------------------------------------------------
		// Декорирование объекта

		self.addClass("osmio-modal-media").html("<span class='osmio-modal-media-loading'></span><a href='' target='_blank'><span></span><img src=''></a><div class='osmio-modal-swf' id='osmio-modal-swf-" + this.id + "'></div>");

		var link	= self.find("a");
		var img		= self.find("a img");
		var span	= self.find("a span");
		var load	= self.find("span.osmio-modal-media-loading");
		var swf		= self.find("div.osmio-modal-swf");

		// Ставим текст
		span.html(options.lang.newWindow); // TODO это — дублирование функционала обновления опций

		// Создаем обкладку (может быть она уже создана — на откуп либе)
		self.osmioModal();

		var modal = {};
		var isLoaded = false;
		var isVideo = false;

		// Когда будет готово — привязываемся к объектам
		self.osmioModal("exec", function(data){

			// Цепляем модальник к текущим элементам
			// Так можно делать потому, что в данном случае элемент будет ровно один, т.к. выполнение уже идет под $(this).each()
			modal = data;

		});


		/**
		 * Функция загружает изображение
		 * @param src
		 * @param title
		 */
		function imageLoad(src, title) {

			if (!src) throw "Empty src";

			// Ставим нужный адрес ссылке
			link.attr("href", src);

			modal.debug("Загрузка изображения");

			img.unbind("load").attr("src", src).load(function(){

				modal.debug("… Загружено");
				imageLoaded(title);

			});

			// Если изображение уже закешировано, то сразу показываем все, что надо
			if (img.attr("complete")) {

				modal.debug("… Уже загружено");
				img.trigger("load");

			}

		}

		/**
		 * Выполняется когда изображение загружено
		 * @param title
		 */
		function imageLoaded(title) {

			// Флаг загруженности
			isLoaded = true;

			// Обновляем окно
			self.osmioModal("option", "title", title);

			// После ресайза слой с флешкой будет показан, а слой с лоадером — спрятан

		}

		self.osmioModal("options", {
			overrides: {
				resize: function(modal, dimensions){

					// Ставим минимально допустимый размер
					var size = modal.checkSize(0, 0, dimensions.availWidth, dimensions.availHeight);

					if (isLoaded) {

						// Восстанавливаем ширину и высоту
						if ($.browser.msie && $.browser.version < 7) { // IE Patch

							img.width("").height("");

						} else {

							img.width("auto").height("auto");

						}

						var width = img.width();
						var height = img.height();

						// Сжимаем картинку

						if (width > dimensions.availWidth || height > dimensions.availHeight) {

							var aspect			= width / height;
							var aspectAvail	= dimensions.availWidth / dimensions.availHeight;

							// Вычисляем размер
							size = modal.checkSize(width, height, dimensions.availWidth, dimensions.availHeight);

							if (aspect > aspectAvail) {

								size.height = Math.round(size.width / aspect);

							} else {

								size.width = Math.round(size.height * aspect);

							}

							img.width(size.width).height(size.height);

						}

						// Повторно запрашиваем размер
						size = {
							width: img.width(),
							height: img.height()
						};

						// Если видео — показываем флешку
						if (isVideo) {

							// Устанавливаем размер
							swf.width(size.width).height(size.height).show();

						}

						// Ставим таймаут, чтобы избежать дерганных изображений во время переключения
						clearTimeout(loadTimeout);
						loadTimeout = setTimeout(function(){

							// Прячем лоадер
							load.hide();

						}, 200);

					} else {

						// Устанавливаем размер
						img.width(size.width).height(size.height);

					}

					return size;

				}
			}
		});

		// Коллбэк на закрытие
		self.osmioModal("bind", "close", function(){

			if (isVideo) {

				try {

					// Останавливаем видео, на всякий случай
					swf.get(0).sendEvent("STOP");

				} catch(e) {

					modal.debug("Ошибка воздействия на плеер: " + e.message);

				}

			}

			/*
			// Какой-то патч для opera — судя по всему для пересчета
			if ($.browser.opera) {

				var padding = $(document).css("paddingRight");
				$(document).css("paddingRight", parseInt(padding) + 1);
				$(document).css("paddingRight", padding);

			}
			*/

		});

		/**
		 * Обработка действий
		 * @param src
		 * @param title
		 * @param video
		 */
		this.action = function(src, title, video) {

			if (typeof src == "string") {

				// Сброс флагов
				isVideo		= (video) ? true : false;
				isLoaded	= false;

				// Полюбому прячем флешку и картинку, включаем загрузчик
				swf.hide();
				load.stop().css({opacity: 1}).show();

				// Открываем окно без заголовка
				self.osmioModal("open").osmioModal("option", "title", false); // это также вызовет ресайз

				// Отчитаемся в дебаг
				modal.debug("Src: " + src + ", Video: " + video);

				if (isVideo) {

					swfobject.embedSWF(options.jwPlayer.url, swf.attr("id"), 100, 100, "9.0.0", options.swfObject.expressInstall, {
						file:				"http://" + location.host + "/" + video,
						image:			src,
						skin:				options.jwPlayer.skin,
						controlbar: "over"
					}, {
						allowscriptaccess:	"always",
						allowfullscreen:		"true",
						wmode:							"transparent",
						quality:						"best"
					}, {}, function(e){

						// Переназначаем объект на новый
						swf = $(e.ref);

						imageLoad(src, title);

					});

				} else {

					imageLoad(src, title);

				}


			} else if (typeof src == "object") {

				options = $.extend({}, options, src);

				// Ставим текст
				span.html(options.lang.newWindow);

				if (options.newWindow) {

					span.show();
					link.unbind('click').removeClass('osmio-modal-media-link-disabled');

				} else {

					span.hide();
					link.click(function(e){ e.preventDefault(); }).addClass('osmio-modal-media-link-disabled');

				}

			} else {

				if (src) throw "Unknown parameter";

			}

		}

	};

	/**
	 * Основная внешняя функция плагина
	 * @param src
	 * @param title
	 * @param video
	 */
	$.fn.osmioModalMedia = function(src, title, video){

		$(this).each(function(){

			var obj = {};
			var id	= $(this).data("osmio-modal-media");

			if (!id) {

				// Создаем объект новый
				obj = new osmioModalMedia(this);
				$(this).data("osmio-modal-media", obj.id);

			} else {

				// Вытаскиваем объект из массива
				obj = modals[id];

			}

			// Отправялем действие в модальник
			obj.action(src, title, video);

		});

		return this;

	}

})(jQuery);